package cn.mrcode.smartFramework.helper;

import cn.mrcode.smartFramework.bean.Hander;
import cn.mrcode.smartFramework.annotation.Action;
import cn.mrcode.smartFramework.bean.Request;
import org.apache.commons.collections4.CollectionUtils;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Created by zhuqiang on 2015/10/20 0020.
 * 控制器 助手, 用来映射 action 注解配置的参数信息  和 对应的 处理方法
 */
public class ControllerHelper {
    // 用于存放 请求 与 处理器的映射 关系
    private static final Map<Request,Hander> ACTION_MAP = new HashMap<>();
    static {
        Set<Class<?>> controllerClassSet = ClassHelper.getControllerClassSet();
        if(CollectionUtils.isNotEmpty(controllerClassSet)){
            for (Class<?> cls : controllerClassSet) {
                Method[] methods = cls.getDeclaredMethods(); // 获取所有的 方法
                for (Method method : methods) {
                    if(method.isAnnotationPresent(Action.class)){ //找到action注解的方法
                        Action action = method.getAnnotation(Action.class);
                        Request request = new Request(action.method().toLowerCase(), action.value());
                        Hander hander = new Hander(cls, method);// hander保存的是, 对应的类  和 方法
                        ACTION_MAP.put(request,hander);  // 把 请求的方法 和路径封装成的request对象,和 处理 该路径的方法 所管理.到时候就能找得到执行谁了
                    }
                }
            }
        }
    }

    /**
     * 通过 请求类型  和  请求路径 获取 对应的处理类
     * @param requestMethod
     * @param requestPath
     * @return
     */
    public static  Hander getHander(String requestMethod,String  requestPath){
        return ACTION_MAP.get(new Request(requestMethod,requestPath));
    }
}
